package com.intelligence.device.cloud.config;

import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSON;
import com.intelligence.common.system.GeneralInterExchangeUtils;
import com.intelligence.common.system.HexadecimalExchangeUtil;
import com.intelligence.common.system.MessageUtil;
import com.intelligence.entity.pojo.Device;
import com.intelligence.entity.pojo.MonpointsDevice;
import com.intelligence.entity.result.Result;
import com.intelligence.openfeign.service.deivce.DeviceFeignService;
import com.intelligence.openfeign.service.deivce.MonpointsDeviceFeignService;
import io.swagger.v3.core.util.Json;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;

import java.util.ArrayList;
import java.util.List;


/**
 * @Author : RulerWood
 * @Data : 2024/5/23 - 22:09
 * 模拟设备向云平台发送数据
 */
@Configuration
public class TimerConfig {

    @Autowired
    private RabbitTemplate rabbitTemplate;
    @Autowired
    private RedisTemplate<String, String> redisTemplate;
    @Autowired
    private DeviceFeignService deviceFeignService;

    /**
     * 模拟设备发送数据采集信息
     * deviceId(设备主键)、basicData(采集数据)、根据设备主键找寻检测范围以及检测类型
     * 只需要传入两个值，一个deviceId、basicData
     * 将两个值转化成16进制并放入到消息队列中
     * <p>
     * 大致流程是：
     * 1、将数据拼接转化成16进制字符串，转换成流发送到云平台
     * 需要转换的数据是：
     * ---1--->土壤酸碱度   deviceId：99
     * ---2--->风速传感器   deviceId：101
     * ---3--->土壤温度    deviceId：103
     * ---4--->风向传感器    deviceId：105
     * ---5--->土壤湿度传感器 deviceId：106
     * ---6--->空气温度传感器  deviceId：108
     * ---7--->土壤电导率（土壤盐分） deviceId：109
     * ---8--->空气湿度传感器   deviceId：110
     * ---9--->气压传感器   deviceId：112
     * ---10--->日降雨量   deviceId：114
     * ---11--->光照度传感器   deviceId：120
     * ---12--->二氧化碳传感器   deviceId：121
     */
//    @Async

    /**
     * 采集51号农场的  8号气象站的12个传感器设备
     */
    @Scheduled(cron = "*/10 * * * * ?")
    public void sendMessage51WeatherStation8() {
        //采集该设备之前我们应该对于设备在线状态查看，如果在线我们去拿取数据
        Object o = redisTemplate.opsForHash().get("monpoints-device", "8");
        List<Device> deviceIds = new ArrayList<>();
        if (ObjectUtil.isEmpty(o)) {
            deviceIds = this.deviceFeignService.listByMid(8).getData();
            redisTemplate.opsForHash().put("monpoints-device", "8", JSON.toJSONString(deviceIds));
        } else {
            deviceIds = JSON.parseArray(o.toString(), Device.class);
        }

        Integer[] integersArray = new Integer[24];
        if (!ObjectUtil.isEmpty(deviceIds)) {
            for (int i = 0; i < integersArray.length / 2; i++) {
                assert deviceIds != null;
                integersArray[i*2]= GeneralInterExchangeUtils.generalGatherId(i * 2,deviceIds);
                integersArray[i * 2 + 1] = GeneralInterExchangeUtils.generalGatherValue(i * 2 + 1);
            }
        }
        String s = HexadecimalExchangeUtil.exchangeTenToHex(integersArray);
        System.err.println("生成一个StringBuffer的字符串" + s);
        System.err.println("生成一个StringBuffer的字符串" + s.length());
        rabbitTemplate.convertAndSend("device-cloud-exchange", "device-cloud-routingKey", s);
    }


    /**
     * 采集51号农场的  12号气象站的12个传感器设备
     */
    @Scheduled(cron = "*/10 * * * * ?")
    public void sendMessage51WeatherStation12() {
        //采集该设备之前我们应该对于设备在线状态查看，如果在线我们去拿取数据
        Object o = redisTemplate.opsForHash().get("monpoints-device", "12");
        List<Device> deviceIds = new ArrayList<>();
        if (ObjectUtil.isEmpty(o)) {
            deviceIds = this.deviceFeignService.listByMid(12).getData();
            redisTemplate.opsForHash().put("monpoints-device", "12", JSON.toJSONString(deviceIds));
        } else {
            deviceIds = JSON.parseArray(o.toString(), Device.class);
        }
        Integer[] integersArray = new Integer[24];
        if (!ObjectUtil.isEmpty(deviceIds)) {
            for (int i = 0; i < integersArray.length / 2; i++) {
                assert deviceIds != null;
                integersArray[i*2]= GeneralInterExchangeUtils.generalGatherId(i * 2,deviceIds);
                integersArray[i * 2 + 1] = GeneralInterExchangeUtils.generalGatherValue(i * 2 + 1);
            }
        }
        String s = HexadecimalExchangeUtil.exchangeTenToHex(integersArray);
        System.err.println("生成一个StringBuffer的字符串" + s);
        System.err.println("生成一个StringBuffer的字符串" + s.length());
        rabbitTemplate.convertAndSend("device-cloud-exchange", "device-cloud-routingKey", s);
    }


    /**
     * 采集51号农场的  167号气象站的12个传感器设备
     */
    @Scheduled(cron = "*/10 * * * * ?")
    public void sendMessage50WeatherStation167() {
        //采集该设备之前我们应该对于设备在线状态查看，如果在线我们去拿取数据
        Object o = redisTemplate.opsForHash().get("monpoints-device", "167");
        List<Device> deviceIds = new ArrayList<>();
        if (ObjectUtil.isEmpty(o)) {
            deviceIds = this.deviceFeignService.listByMid(167).getData();
            redisTemplate.opsForHash().put("monpoints-device", "167", JSON.toJSONString(deviceIds));
        } else {
            deviceIds = JSON.parseArray(o.toString(), Device.class);
        }
        Integer[] integersArray = new Integer[24];
        if (!ObjectUtil.isEmpty(deviceIds)) {
            for (int i = 0; i < integersArray.length / 2; i++) {
                assert deviceIds != null;
                integersArray[i*2]= GeneralInterExchangeUtils.generalGatherId(i * 2,deviceIds);
                integersArray[i * 2 + 1] = GeneralInterExchangeUtils.generalGatherValue(i * 2 + 1);
            }
        }
        String s = HexadecimalExchangeUtil.exchangeTenToHex(integersArray);
        System.err.println("生成一个StringBuffer的字符串" + s);
        System.err.println("生成一个StringBuffer的字符串" + s.length());
        rabbitTemplate.convertAndSend("device-cloud-exchange", "device-cloud-routingKey", s);
    }
}
